/**
 * 国际-地方联盟
 * http://www.xinhuanet.com/city/lm.htm
 */

var cheerio=require("cheerio");//引用抓取html结构的node模块
var mkdirp=require("mkdirp");  //引用创建文件夹的node模块
var iconv=require("iconv-lite"); //引用字符集node模块
var commen=require("../allocation/commen");//引用公共操作的自定义文件
var data=require("../allocation/sql");  //引用数据库操作的自定义文件
var async   = require("async");  //引用同步执行

var url       = "http://www.xinhuanet.com/city/lm.htm";
var chanel    = "difanglianmeng";
var newsType  = 1;
var imgSite   = "";
var website   ="";
var newsLists = [];   //存放新闻列表
var logs=[];   //存放日志信息
  //记录是否采集完成

//创建存放图片的文件夹及路径(20160901)
var imgPath               = commen.createDownFile().imgPath;

mkdirp.sync(imgPath);

logs.push({
    start_time:new Date().toLocaleString(),
    article_type_id:newsType,
    thread:chanel
});

//定义获取新闻列表
function getNewsList(url,callback)
{
    commen.load(url,function(err,body){
        if(err)
        {
            logs[0].location="列表请求";
            logs[0].message="错误："+err;
            logs[0].level=0;
            logs[0].end_time=new Date().toLocaleString();
            data.insertLog(logs[0],function(err,result){
                if(err) throw err;
                if(result>0)
                {
                    console.log("列表请求出错了！！！!");
                    process.exit(0);
                }
            });
            return err;
        }
        var  $  =cheerio.load(body.toString());
        var articleList = [];
        //获取新闻列表
        $(".hideBody h3").each(function () {
            articleList.push($(this).find("a").attr("href"));
        });
        callback(null, articleList);
    });
}

//定义获取新闻内容
function getNewsContent(url,callback)
{
    commen.load(url,function(err,body){
        if(err)
        {
            logs[0].location="内容请求";
            logs[0].message="错误："+err;
            logs[0].level=0;
            logs[0].end_time=new Date().toLocaleString();
            data.insertLog(logs[0],function(err,result){
                if(err) throw err;
                if(result>0)
                {
                    console.log("内容请求出错了！！！");
                    process.exit(0);
                }
            });
            return err;
        }
        var $           = cheerio.load(body, {decodeEntities: false});
        var news        = [];
        var picUrls     = []; //存放图片的数组
        var allContent  = "";  //存放排版好的ubb格式的内容]



        if($(".article img").length>0)
        {
            for(var i=0;i<$(".article img").length;i++)
            {
                //改
                if($($(".article").find("img")[i]).attr("src")==undefined)
                    {
                        $($(".article").find("img")[i]).remove();
                        continue;
                    }
                    else
                    {
                        if($($(".article").find("img")[i]).attr("src").indexOf(":")>0)
                        {
                            imgSite="";
                        }
                        else
                        {
                            imgSite = url.substring(0,url.lastIndexOf("/")+1);
                        }
                        if($($(".article").find("img")[i]).attr("src").indexOf("=")>0)
                        {
                            $($(".article").find("img")[i]).remove();
                        }
                    
                        if($($(".article").find("img")[i]).parent("p").html()==null)
                        {
                            $($(".article").find("img")[i]).parent().replaceWith("<p>"+$($(".article").find("img")[i]).parent().html()+"</p>");
                        }
                        
                        picUrls.push(imgSite+$($(".article").find("img")[i]).attr("src"));
                         //改1  (下面注释部分全部删除即1-1至1-2)
                        
                    }
            }
        }

        $(".article  script").remove();
        $(".article  style").remove();
        $(".article div").remove();

        if($(".article").html()==null)
        {
            logs[0].location="解析标签";
            logs[0].message="去除标签错误：Cannot read property 'replace' of null";
            logs[0].level=0;
            logs[0].end_time=new Date().toLocaleString();
            data.insertLog(logs[0],function(err,result){
                if(err) throw err;
                if(result>0)
                {
                    console.log("去除标签出错了！！！");
                    process.exit(0);
                }
            });
            return err;
        }
        else
        {
            //去除内容html中的空格和样式
            $(".article").html($(".article").html().replace(/<!--[\w\W\r\n]*?-->/gmi,'').trim());
            //$(".article").html($(".article").html().replace(/<([a-zA-Z1-6]+)(\s*[^>]*)?>/g, "<$1>"));
        }


        //找到内容中所有的p标签
        for (var i = 0; i <$(".article").find("p").length; i++) 
             {

                    if($($(".article").find("p")[i]).find("img")=="")
                    {
                       
                        if($($(".article").find("p")[i]).text().trim()=="")
                        {
                            $($(".article").find("p")[i]).remove();
                        }
                        
                    }
             }
             for (var i = 0; i <$(".article").find("p").length; i++) {

                if($($(".article").find("p")[i]).find("img")=="")
                {
                         if($($(".article").find("p")[i]).attr("align")=="center")
                         {

                          //说明属性align:center使得文字居中
                          $($(".article").find("p")[i]).text("[text-align:center]"+$($(".article").find("p")[i]).html());
                      
                         }
                         else
                         {

                             //说明无align属性，判断是否有style样式
                             if($($(".article").find("p")[i]).attr("style")==undefined)
                             {
                                 // 说明无style
                                $($(".article").find("p")[i]).text("[&emsp][&emsp]" + $($(".article").find("p")[i]).html());
            
                             }
                             else
                             {
                                if($($(".article").find("p")[i]).attr("style").indexOf("center")>0)
                                {
                                 //说明居中
                                  $($(".article").find("p")[i]).text("[text-align:center]"+$($(".article").find("p")[i]).html());
                      
                                }
                                else
                                {
                            
                                   //说明不居中
                                   $($(".article").find("p")[i]).text("[&emsp][&emsp]" + $($(".article").find("p")[i]).html());
                

                                }

                             }

                         }

                }
                else
                {
                    $($(".article").find("p")[i]).find("img").parent("p").html("[text-align:center][img]"+imgSite+$($(".article").find("p")[i]).find("img").attr("src")+"[/img]");
                
                }
                

            }
            
        if($(".article").html()==null)
        {
            logs[0].location="解析标签";
            logs[0].message="转换标签错误：Cannot read property 'replace' of null";
            logs[0].level=0;
            logs[0].end_time=new Date().toLocaleString();
            data.insertLog(logs[0],function(err,result){
                if(err) throw err;
                if(result>0)
                {
                    console.log("转换标签出错了！！！");
                    process.exit(0);
                }
            });
            return err;
        }
        else
        {
            //替换内容中所有的&nbsp;$gt等标签为ubb格式
            $(".article").html($(".article").html().replace(/<([a-zA-Z1-6]+)(\s*[^>]*)?>/g, "<$1>"));
            allContent = $(".article").html().trim().replace(/>/g, "]").replace(/</g, "[").replace(/&rdquo;/g, "[&rdquo]").replace(/&ldquo;/g,"[&ldquo]").replace(/&nbsp;/g,"[&nbsp]").replace(/&amp;/g,"[&amp]").replace(/&gt;/g,"[&gt]").replace(/&lt;/g,"[&lt]");
        }


        //将插入数据库的值存入数组news中
        news.push({
            title:$("#title").text().trim(),
            source:$("#source")?$("#source").text().trim():"新华网",
            author:"佚名",
            date:new Date().toLocaleString(),
            typeID:newsType,
            chanel:chanel,
            content:allContent,
            picUrls:picUrls
        });
        callback(null, news[0]);
    });
}




//调用方法，依次获取列表和内容，并存入数据库
async.series([
    // 获取新闻列表
    function (done) {
        getNewsList(url,function(err,list){
            newsLists = list;
            done(err);
        });
    },
    function (done) {
        async.eachSeries(newsLists, function (item, next) {
            getNewsContent(item, function (err,detail) {
                if (err) console.error(err.stack);
                data.insertData(detail,imgPath,function(err,result){
                    //数组(title,source等，打印内容，就是detail.content)
                    if(err)
                    {
                        logs[0].location="入库";
                        logs[0].message="错误："+err;
                        logs[0].level=0;
                        logs[0].end_time=new Date().toLocaleString();
                        data.insertLog(logs[0],function(err,result){
                            if(err) throw err;
                            if(result>0)
                            {
                                console.log("入库出错了！！！");
                                process.exit(0);
                            }
                        });
                        return err;
                    }
                    else if(result>0)
                    {
                        console.log("采集成功");
                    }
                });
                next();
            });
        }, done);
    }
],function (err) {
    if (err) console.error(err.stack);

    logs[0].location="无";
    logs[0].message="正确";
    logs[0].level=1;
    logs[0].end_time=new Date().toLocaleString();
    data.insertLog(logs[0],function(err,result){
        if(err) throw err;
        if(result>0)
        {
            console.log("写入日志成功!");
            console.log('采集完成');
            process.exit(0);
        }
    });
});















